admin的网址和登陆密码


  • 域名:端口号/admin/

  • 账号和密码一般都是你所创建的超级用户

http://127.0.0.1:8001/admin/

admin的相关配置


1. 让admin读取你所创建的表

  • 语法: admin.site.register(表的类)

# app01/admin.py

from django.contrib import admin
from .models import *

admin.site.register(UserInfo)
admin.site.register(Article)
admin.site.register(Blog)

2. 使用中文显示admin网站

  • 将配置文件中的 LANGUAGE_CODE 设置为 zh-hans

# settings.py

LANGUAGE_CODE = 'zh-hans'

3. 使用中文显示表名

  • 在表的类中配置元信息

# models.py

class UserInfo(AbstractUser):

    nid = models.AutoField(primary_key=True)
    phone = models.CharField(max_length=11, null=True, unique=True, blank=True)

    def __str__(self):
        return self.username

    class Meta:
        verbose_name = "用户信息表"
        verbose_name_plural = verbose_name

4. 使用中文显示字段名

  • verbose_name='字段名'

# models.py

class Blog(models.Model):

    nid = models.AutoField(primary_key=True)
    title = models.CharField(max_length=64, verbose_name='个人博客标题')
    site = models.CharField(max_length=32, unique=True, verbose_name='个人博客后缀')
    theme = models.CharField(max_length=32, verbose_name='博客主题')

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = "博客信息表"
        verbose_name_plural = verbose_name

5. 允许该字段在 admin 为空

  • 有时候使用admin添加数据的时候,就算表的类设置该字段为空,但是admin还是会提醒该字段必填

  • blank=True

class ArticleUpDown(models.Model):

    nid = models.AutoField(primary_key=True)
    user = models.ForeignKey('UserInfo', null=True, verbose_name='作者id', blank=True)
    article = models.ForeignKey("Article", null=True, verbose_name='文章id', blank=True)
    is_up = models.BooleanField(default=True, verbose_name='是否点赞了')

    class Meta:
        verbose_name = "点赞表"
        verbose_name_plural = verbose_name
        unique_together = [
            ('article', 'user'),
        ]

6. 如果在 admin 表中显示 xxx object 那么就是没有使用 __str__

# models.py

class Blog(models.Model):

    nid = models.AutoField(primary_key=True)
    title = models.CharField(max_length=64, verbose_name='个人博客标题')
    site = models.CharField(max_length=32, unique=True, verbose_name='个人博客后缀')
    theme = models.CharField(max_length=32, verbose_name='博客主题')

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = "博客信息表"
        verbose_name_plural = verbose_name

admin的相关定制


1.让admin读取你所创建的表

  • 语法: admin.site.register(表的类)

# app01/admin.py

from django.contrib import admin
from .models import *

admin.site.register(UserInfo)
admin.site.register(Article)
admin.site.register(Blog)

2. 对单独的表进行配置的写法

  • 写法一

from django.contrib import admin
from .models import *


class BookAdmin(admin.ModelAdmin):
    list_display = ['title', 'publish_date', 'price', 'memo', 'publisher']

admin.site.register(Book, BookAdmin)


class PublisherAdmin(admin.ModelAdmin):
    list_display = ['name', 'city']

admin.site.register(Publisher, PublisherAdmin)

  • 写法二

from django.contrib import admin
from .models import *

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ['title', 'publish_date', 'price', 'memo', 'publisher']

@admin.register(Publisher)
class PublisherAdmin(admin.ModelAdmin):
    list_display = ['name', 'city']

3. 相关的参数

  • list_display -> 在数据列表里,显示该表的某几个字段


from django.contrib import admin
from .models import *

class BookAdmin(admin.ModelAdmin):
list_display = ['title', 'publish_date', 'price', 'memo', 'publisher']

admin.site.register(Book, BookAdmin)

  • .short_description -> 给函数方法添加描述

    • 显示多对多字段的数据 和 action 中有相关用法

  • 显示多对多字段的数据

    • admin 无法直接显示多对多字段中的数据


from django.contrib import admin
from .models import *


class BookAdmin(admin.ModelAdmin):
    list_display = ['title', 'price', 'show_author']

    def show_author(self, obj):
        author_list = []
        for role in obj.author.all():
            author_list.append(role.name)
        return ','.join(author_list)

    show_author.short_description = '作者'  # 修改显示的字段名称

admin.site.register(Book, BookAdmin)

  • list_display_links -> 在数据列表里,指定该表的某几个字段可以进行跳转(即: 点击该字段跳转到编辑页面)


from django.contrib import admin
from .models import *

class BookAdmin(admin.ModelAdmin):
    list_display = ['title', 'publish_date', 'price', 'memo', 'publisher']
list_display_links = ['title', 'publish_date', 'price', 'memo', 'publisher']

admin.site.register(Book, BookAdmin)

  • list_filter -> 在数据列表里,定制右侧快速筛选功能


from django.contrib import admin
from .models import *

class BookAdmin(admin.ModelAdmin):
    list_display = ['title', 'publish_date', 'price', 'memo', 'publisher']
list_filter = ['price', 'memo', 'publisher']  # 如果 publisher 外键字段所关联的表中只有一条数据的话,那么它是不会显示的

admin.site.register(Book, BookAdmin)

  • list_select_related -> 连表查询是否自动select_related

from django.contrib import admin
from .models import *

class BookAdmin(admin.ModelAdmin):
list_select_related = True

admin.site.register(Book, BookAdmin)

  • list_editable -> 在数据列表里,指定列表中可以编辑的列

    • list_editable 和 list_display_links 是有冲突的,如果 xxx 字段填写在 list_editable 里,那么该字段就不要填写在 list_display_links 里面,反之


from django.contrib import admin
from .models import *

class BookAdmin(admin.ModelAdmin):
    list_display = ['title', 'publish_date', 'price', 'memo', 'publisher']
    list_display_links = ['publish_date']  # 必须要指定一个可以进行跳转的字段,因为 admin 默认是使用第一个字段,但是此时第一个字段已经被设置成在列表可编辑了
list_editable = ['title', 'price']

admin.site.register(Book, BookAdmin)

  • ordering -> 在数据列表里,指定数据的排序规则


from django.contrib import admin
from .models import *

class BookAdmin(admin.ModelAdmin):
    list_display = ['id', 'title', 'price']
ordering = ['-id']

admin.site.register(Book, BookAdmin)

  • search_fields -> 在数据列表里,指定某几个字段可以使用模糊查询功能


from django.contrib import admin
from .models import *

class BookAdmin(admin.ModelAdmin):
    list_display = ['title', 'publish_date', 'price', 'memo', 'publisher']
search_fields = ['title', 'price']

admin.site.register(Book, BookAdmin)

  • date_hierarchy -> 在数据列表里,对Date和DateTime类型进行搜索

    • 只接受日期类型的字段名


from django.contrib import admin
from .models import *

class BookAdmin(admin.ModelAdmin):
    list_display = ['title', 'publish_date', 'price', 'memo', 'publisher']
date_hierarchy = 'publish_date'  # 只接受日期类型的字段名

admin.site.register(Book, BookAdmin)

  • action -> 在数据列表里,自定义action(即: 动作)


from django.contrib import admin
from .models import *

class BookAdmin(admin.ModelAdmin):

# 定制Action行为具体方法
    def func(self, request, queryset):
'''
        :param queryset: 所有被选中的数据
        '''
        queryset.update(price=100)

    func.short_description = "批量初始化价格"
    actions = [func, ]

 # Action选项都是在页面上方显示
    actions_on_top = True
 # Action选项都是在页面下方显示
    actions_on_bottom = False

 # 是否显示选择个数
    actions_selection_counter = True


admin.site.register(Book, BookAdmin)

  • empty_value_display -> 在数据列表里,如果如果数据为空就显示默认值


from django.contrib import admin
from .models import *

class BookAdmin(admin.ModelAdmin):
    list_display = ['title', 'price', 'memo']

empty_value_display = "列数据为空时,默认显示"

    def memo(self, obj):
        return obj.memo

    memo.empty_value_display = "指定列数据为空时,默认显示"

admin.site.register(Book, BookAdmin)

  • raw_id_fields -> 在数据详细页里,将外键字段和多对多字段变成以input框的形式显示


from django.contrib import admin
from .models import *

class BookAdmin(admin.ModelAdmin):
raw_id_fields = ['publisher', 'author']  # publisher 是外键字段,author 是多对多字段

admin.site.register(Book, BookAdmin)

  • fields -> 在数据详细页里,显示指定的某几个字段,默认全部显示


from django.contrib import admin
from .models import *

class BookAdmin(admin.ModelAdmin):
fields = ['title', 'price']

admin.site.register(Book, BookAdmin)

  • exclude -> 在数据详细页里,不显示指定的某几个字段


from django.contrib import admin
from .models import *

class BookAdmin(admin.ModelAdmin):
exclude = ['publisher', 'author']

admin.site.register(Book, BookAdmin)

  • readonly_fields -> 在数据详细页里,指定的某几个字段为只读


from django.contrib import admin
from .models import *

class BookAdmin(admin.ModelAdmin):
readonly_fields = ['title']

admin.site.register(Book, BookAdmin)

  • fieldsets -> 在数据详细页里,对数据进行分割显示


from django.contrib import admin
from .models import *

class BookAdmin(admin.ModelAdmin):
fieldsets = [
        ['基本数据', {
            'fields': ['title', 'price', 'memo', ]
        }],
        ['其他', {
            'fields': ['publisher', 'author'],
        }],
    ]

admin.site.register(Book, BookAdmin)

  • filter_vertical -> 在数据详细页里,多对多字段显示时,数据移动选择(方向:上下和左右)


from django.contrib import admin
from .models import *

class BookAdmin(admin.ModelAdmin):
filter_vertical = ['author']  # 必须传入多对多字段

admin.site.register(Book, BookAdmin)

  • radio_fields -> 在数据详细页里,将外键字段以radio的形式显示(默认使用select)


from django.contrib import admin
from .models import *

class BookAdmin(admin.ModelAdmin):
radio_fields = {"publisher": admin.VERTICAL}  # 或admin.HORIZONTAL

admin.site.register(Book, BookAdmin)

  • save_on_top -> 在数据详细页里,在页面上方是否也显示保存删除等按钮


from django.contrib import admin
from .models import *

class BookAdmin(admin.ModelAdmin):
save_on_top = True

admin.site.register(Book, BookAdmin)

  • save_as -> 在数据详细页里,修改保存按钮的状态

    • save_as = True


from django.contrib import admin
from .models import *

class BookAdmin(admin.ModelAdmin):
    save_as = True

admin.site.register(Book, BookAdmin)

    • save_as = False


from django.contrib import admin
from .models import *

class BookAdmin(admin.ModelAdmin):
    save_as = False

admin.site.register(Book, BookAdmin)

  • save_as_continue -> 在数据详细页里,点击保存并继续编辑

from django.contrib import admin
from .models import *

class BookAdmin(admin.ModelAdmin):
save_as_continue = True

admin.site.register(Book, BookAdmin)

  • 定制HTML模板

add_form_template = 'xxx.html'
change_form_template = 'xxx.html'
change_list_template = 'xxx.html'
delete_confirmation_template = 'xxx.html'
delete_selected_confirmation_template = 'xxx.html'
object_history_template = 'xxx.html'

  • inlines -> 在数据详细页里,如果有其他表和当前表做外键关联的时候,那么详细页面可以进行动态增加和删除

class UserInfoInline(admin.StackedInline): # TabularInline
    extra = 0
    model = models.UserInfo

class GroupAdminMode(admin.ModelAdmin):
    list_display = ('id', 'title',)
    inlines = [UserInfoInline, ]

  • form=ModelForm,用于定制用户请求时候表单验证

from app01 import models
from django.forms import ModelForm
from django.forms import fields

class MyForm(ModelForm):
    others = fields.CharField()

    class Meta:
        model = models = models.UserInfo
        fields = "__all__"

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    form = MyForm